package duadikoDentro;
import java.io.*;
import java.util.Queue;
import java.util.LinkedList;

public class dentro
{
private BTNode root;     
private int size;     
boolean left=true;     
boolean right=false;     

public dentro()
{
root=null;
size=0;
}
public int getSize()     
{
return size;
}
public void setSize(int a)
{
size=a;
}
public BTNode getRoot()     
{
return root;
}
public void setRoot(BTNode a)
{
root=a;
}
public boolean isRoot(BTNode a)     
{
return (root==a);
}
public boolean isLeft(BTNode a)     
{
if (root==a)
{
System.out.println("  ");
return false;
}
return (a==a.getParent().getLeft());
}
public boolean isRight(BTNode a)     
{
if (root==a)
{
System.out.println("  ");
return false;
}
return (a==a.getParent().getRight());
}
public void exchangeElements(BTNode a,BTNode b)     
{
Item temp=a.getItem();
a.setItem(b.getItem());
b.setItem(temp);
}
public BTNode findNode(int key,BTNode a)     
{                                              
int nodeKey=a.getItem().getKey();              

if (key<nodeKey)
{
if (a.getLeft()==null)
return a;
else
return findNode(key,a.getLeft());
}
else if (key==nodeKey)
return a;
else
{
if(a.getRight()==null)
return a;
else
return findNode(key,a.getRight());
}
}
public void addLeaf(BTNode a,boolean kindOfSon)
{
if (kindOfSon==left)     
{
if (a.getLeft()!=null)     
{
System.out.println("  !");
return;
}

a.setLeft(new BTNode(null,a,null,null));     
}
else     
{
if (a.getRight()!=null)     
{
System.out.println("  !");
return;
}

a.setRight(new BTNode(null,a,null,null));     
}
size++;     
}
public BTNode insertItem(Item i)          
{                                                          
if(size==0)                                        
{                                                          
setRoot(new BTNode(i,null,null,null));
setSize(1);
return root;
}

BTNode insNode=findNode(i.getKey(), getRoot());     
int keyNode=insNode.getItem().getKey();     

if (keyNode==i.getKey())     
return null;
else     
{
if(i.getKey()<keyNode)
{
addLeaf(insNode, left);
insNode.getLeft().setItem(i);
return insNode.getLeft();
}
else      
{
addLeaf(insNode,right);
insNode.getRight().setItem(i);
return insNode.getRight();
}
}
}
public void inorder(BTNode n)
{
if(n!=null)
{
inorder(n.getLeft());
System.out.println("Inorder:Node key="+n.getItem().getKey());
inorder(n.getRight());
}
}
public void preorder(BTNode n)
{
if(n!=null)
{
System.out.println("Preorder:Node key="+n.getItem().getKey());
preorder(n.getLeft());
preorder(n.getRight());
}
}
public void postorder(BTNode n)
{
if(n!=null)
{
postorder(n.getLeft());
postorder(n.getRight());
System.out.println("Postorder:Node key="+n.getItem().getKey()); 
}
}
public void printLevelByLevel(BTNode n)
{
Queue<BTNode> nodeQueue = new LinkedList<BTNode>();
nodeQueue.add(n);

while(!nodeQueue.isEmpty()) 
{
BTNode currentNode = nodeQueue.remove();
System.out.println("LevelByLevel:Node key="+currentNode.getItem().getKey());
if(currentNode.getLeft()!=null) {
nodeQueue.add(currentNode.getLeft());
}
if(currentNode.getRight()!=null) {
nodeQueue.add(currentNode.getRight());
}
}
}
}